#include "Service.h"
#include "User.h"
#include "Directory.h"
#include "File.h"
#include <header.h>
#include "RequestHeader.h"
#include "RequestParameter.h"
#include "ResponseHeader.h"
#include "DAO.h"
#include "HashMap.h"
#include "Global.h"
#include "FileManager.h"
#include "PublicUtils.h"
#include "Token.h"

/* login */
int userLoginService(int net_fd, RequestHeader *header, MYSQL *conn){
    /**
     * 参数一：uname
     * 参数二：token（可能无）
    */
    RequestParameter *param = recvLinkedList(net_fd, header->argcnt);
    
    User *user = findUserByNameDAO(conn, param->argv);
    if(user == NULL){
        freeLinkedList(param);
        return 0;
    }
    
    int token_uid = -1;
    if(header->argcnt == 2){
        /* 如果有token */
        token_uid = token_decode(param->next->argv);
    }

    if(user->uid > 0 && token_uid > 0 && user->uid == token_uid){
        freeLinkedList(param);
        return 1;
    }
    
    /* 发送盐值 */
    sendResponseHeader(net_fd, 2, user->salt);
    
    RequestParameter *param2 = recvLinkedList(net_fd, 1);
    

    if(strcmp(user->cryptpwd, param2->argv) != 0){
        /* 密码不对 */
        return 0;
    }
    /* 更新token,发送给客户端 */
    char *token = token_encode(user->uid);
    sendResponseHeader(net_fd, 1, token);
    
    free(token);
    destroyUser(user);
    freeLinkedList(param);
    freeLinkedList(param2);
    return 1;
}




/* register */
int userRegisterService(int net_fd, RequestHeader *header, MYSQL *conn){
    /**
     * 参数一：uname
     * 参数二：cryptpwd
    */
    RequestParameter *param = recvLinkedList(net_fd, header->argcnt);

    /* 先查询有无此用户 */
    int ret = findUserIdByNameDAO(conn, param->argv);

    /* 用户已存在，则注册失败 */
    if(ret > 0){
        printf("user exists\n");
        return 0;
    }

    /* 无则插入该用户，注册成功 */
    int uid = insertUserDAO(conn, param->argv, param->next->argv);
    /* 还要插入目录 */
    User *user = createUser(uid, param->argv, "", "", param->argv);
    insertDirectoryByUserIdDAO(conn, user);

    char *token = token_encode(uid);
    ResponseHeader *response = createResponseHeader(1, token);
    send(net_fd, response, sizeof(ResponseHeader), MSG_NOSIGNAL);
    freeResponseHeader(response);

    free(token);
    destroyUser(user);
    freeLinkedList(param);
    return 1;
}





/* cd */
void userChangeDirectoryService(){
    // ! 这是一个重要注释
    // ? 这是一个疑问注释
    // TODO 这是一个待办事项
    // * 这是一个警告注释
    // ~ 这是一个删除线注释
}

/* mkdir */
void userMakeDirectoryService(){

}


/* ls */
void userListDirectoryContentsService(){

}


/* pwd */
void userPrintWorkingDirectoryService(){

}





/* rm */
int userDropFileOrDirectoryService(int net_fd, RequestHeader *header, MYSQL *conn){
    
    return 1;
}